/**
 * Copyright (c) 2020 Coder League
 * All rights reserved.
 *
 * File：OrganizationService.java
 * History:
 *         2020年12月20日: Initially created, Chrise.
 */
package club.coderleague.cfss.service.organization;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import club.coderleague.cfss.dao.OrganizationDao;
import club.coderleague.cfss.domain.entities.Organizations;
import club.coderleague.cfss.domain.enums.EntityState;

/**
 * 机构服务。
 * @author Chrise
 */
@Service
public class OrganizationService {
	@Autowired
	private OrganizationDao organizationDao;
	
	/**
	 * 获取机构管理数据。
	 * @author Chrise 2020年12月20日
	 * @param params 查询参数。
	 * @return 机构管理数据。
	 */
	public List<Map<String, Object>> getOrgMgrListService(Map<String, Object> params) {
		List<Map<String, Object>> result = this.organizationDao.getOrgMgrListDao(params);
		return result;
	}
	
	/**
	 * 获取父级机构数据。
	 * @author Chrise 2020年12月20日
	 * @return 父级机构数据。
	 */
	public List<Map<String, Object>> getParentOrgSelectListService() {
		List<Map<String, Object>> result = this.organizationDao.getParentOrgSelectListDao();
		Map<String, Object> map = new HashMap<String, Object>();
		map.put("entityid", "-1");
		map.put("orgname", "顶层机构");
		map.put("parentorg", "");
		result.add(0, map);
		return result;
	}
	
	/**
	 * 根据机构标识获取机构对象。
	 * @author Chrise 2020年12月20日
	 * @param entityid 机构标识。
	 * @return 机构对象。
	 */
	public Organizations getOrgObjByOrgidService(Long entityid) {
		return this.organizationDao.getOne(entityid);
	}
	
	/**
	 * 新增/编辑机构对象。
	 * @author Chrise 2020年12月20日
	 * @param orgObj 机构对象。
	 * @param result 返回结果。
	 */
	public void insertOrUpdateOrgObjService(Organizations orgObj, Map<String, Object> result) {
		Boolean repeat = this.organizationDao.getRepeatDataByOrgNameOrParentOrgDao(orgObj.getOrgname(), orgObj.getParentorg(), orgObj.getEntityid());
		if (repeat) {
			result.put("state", false);
			result.put("msg", "已存在重复的名称！");
			return;
		}
		if (orgObj.getParentorg() == null) orgObj.setParentorg(null);
		this.organizationDao.save(orgObj);
		result.put("state", true);
		result.put("msg", "操作成功！");
	}
	
	/**
	 * 修改机构状态。
	 * @author Chrise 2020年12月20日
	 * @param entityid 机构标识。
	 * @param entitystate 实体状体。
	 * @param result 返回操作数据。
	 */
	public void updateEntitystateByOrgidService(String entityid, Integer entitystate, Map<String, Object> result) {
		String[] ids = entityid.split(","); 
		for (String orgid : ids) {
			Organizations orgObj = this.organizationDao.getOne(Long.parseLong(orgid));
			if (entitystate == EntityState.VALID.getValue()) { // 恢复数据。
				Boolean repeat = this.organizationDao.getRepeatDataByOrgNameOrParentOrgDao(orgObj.getOrgname(), orgObj.getParentorg(), orgObj.getEntityid());
				if (repeat) {
					result.put("state", false);
					result.put("msg", "已存在重复的名称！");
					return;
				}
				if (orgObj.getParentorg() != null) this.updateParentOrgEntitystateService(entitystate, orgObj.getParentorg()); // 恢复父级。
			} else this.updateChildEntitystateService(entitystate, orgObj.getEntityid()); // 删除子级。
			orgObj.setEntitystate(entitystate);
		}
		result.put("state", true);
		result.put("msg", "操作成功！");
	}
	
	/**
	 * 修改父级状态。
	 * @author Chrise 2020年12月20日
	 * @param entitystate 实体状态。
	 * @param dataid 数据标识。
	 */
	private void updateParentOrgEntitystateService(Integer entitystate, Long dataid) {
		while (true) {
			Organizations orgObj = this.organizationDao.getOne(dataid);
			if (orgObj != null && orgObj.getEntitystate() != EntityState.VALID.getValue()) {
				orgObj.setEntitystate(entitystate);
				if (orgObj.getEntitystate() == entitystate) break;
                if (orgObj.getParentorg() != null) this.updateParentOrgEntitystateService(entitystate, orgObj.getParentorg());
            }
            break;
		}
	}
	
	/**
	 * 修改子级状态。
	 * @author Chrise 2020年12月20日
	 * @param entitystate 实体状态。
	 * @param dataid 数据标识。
	 */
	private void updateChildEntitystateService(Integer entitystate, Long dataid) {
		while (true) {
            List<Organizations> orgList = this.organizationDao.findByParentorg(dataid);
            if (orgList.size() > 0) {
                for (Organizations org : orgList) {
    				org.setEntitystate(entitystate);
                    this.updateChildEntitystateService(entitystate, org.getEntityid());
                }
            }
            break;
        }
	}
	
	/**
	 * 根据机构标识查询机构详情。
	 * @author Chrise 2020年12月20日
	 * @param entityid 机构标识。
	 * @return 机构详情数据。
	 */
	public Map<String, Object> getOrganizationsDetailDataByOrgidService(String entityid) {
		return this.organizationDao.getOrganizationsDetailDataByOrgidDao(entityid);
	}
}
